www.gusucode.com > 一个美化窗口实例 VC++漂亮界面源码程序 > 一个美化窗口实例 VC++漂亮界面/VC++菜单类的演示/VC++菜单类的演示/MyDateEdit.cpp

    
#include "stdafx.h"
#include "MyDateEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CMyDateEdit,CEdit)
BEGIN_MESSAGE_MAP(CMyDateEdit, CEdit)
	//{{AFX_MSG_MAP(CMyDateEdit)
	ON_WM_CHAR()
	ON_WM_KEYDOWN()
	ON_WM_KILLFOCUS()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_CUT, OnCut)
	ON_MESSAGE(WM_PASTE, OnPaste)
	ON_MESSAGE(WM_CLEAR, OnClear)
END_MESSAGE_MAP()
CMyDateEdit::CMyDateEdit()
{
	Reset();
	m_isDateTime=TRUE;
//	SetClassType(edit_datetime);
}

CMyDateEdit::~CMyDateEdit()
{
}
/////////////////////////////////////////////////////////////////////////////
// CMyDateEdit message handlers
void CMyDateEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CString str;
	GetWindowText(str);
	for (int i = 0; i<str.GetLength() && i<m_str.GetLength();i++)
		m_str.SetAt(i, str.GetAt(i));
	if(!m_bMaskKeyInProgress)
		if(!CheckChar(nChar)) return;
		if(m_bUseMask)  //要使用掩码
		{
			if(isdigit(nChar))  //是可打印字符
			{
				int startPos,endPos;
				GetSel(startPos,endPos);
				SetSel(startPos,endPos+1);
				if(m_strMask.GetAt(startPos)=='-'||m_strMask.GetAt(startPos)==':'||m_strMask.GetAt(startPos)==' ')
				{
					SetSel(startPos+1,startPos+1);
					SendChar(nChar);
					return;
				}
			}
			else if(nChar==VK_BACK)
			{
				int startPos,endPos;
				GetSel(startPos,endPos);
				if((startPos==endPos) && (startPos>=1) && (startPos<=m_str.GetLength()))
				{
					char c;
					c=m_strMask.GetAt(startPos-1);
					if(c=='-'||c==':'||c==' ') 
					{					
						SetSel(startPos-1,startPos-1);
						return;
					}
					////回退光标
					SetSel(startPos-1,startPos-1);
					SendChar(c);
						//再次退回
					SendMessage(WM_KEYDOWN,VK_LEFT,0);
				}
				else   //越界或者存在选择区域
					MessageBeep((UINT)-1);
				return;
			}

		}
	CEdit::OnChar(nChar, nRepCnt, nFlags);
}

void CMyDateEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{

	if(m_bUseMask)
	{
		switch(nChar)//忽略删除和插入键
		{
		case VK_DELETE:
		case VK_INSERT: return;
		}
	}
	CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CMyDateEdit::CheckChar(UINT nChar)
{
	int nTime = 0;
	//如果不使用掩码,则返回
	if(!m_bUseMask)	return TRUE;
	//如果是控制字符,则返回
	if(!isprint(nChar)) return TRUE;
	if(!isdigit(nChar))	
	{
		MessageBeep((UINT)-1);
		return FALSE;
	}
	//如果存在选择区域,则取消选择
	int startPos,endPos;
	GetSel(startPos,endPos);
	SetSel(-1,0);
	//重新选中原选择区域的第一个字符
	SetSel(startPos,startPos);
	GetSel(startPos,endPos);
	//确保字符串的长度不超过掩码的长度
	if(endPos>=m_strMask.GetLength())
	{
		MessageBeep((UINT)-1);
		return FALSE;
	}
	//时间格式
	if(m_isTime)
	{
		if(!CheckTime(nChar,startPos,endPos))
		{
			return FALSE;
		}
	}
	//日期格式
	if(m_isDate)
	{
		if(!CheckDate(nChar,startPos,startPos))
		{
			return FALSE;
		}
	}
	if(m_isDateTime)
	{
		if(!CheckDate(nChar,startPos,startPos))
		{
			return FALSE;
		}
		if(!CheckTime(nChar,startPos,startPos))
		{
			return FALSE;
		}
	}
    return TRUE;
}
BOOL CMyDateEdit::CheckDate(char nchar,int StartPos,int EndPos)
{	
	CString strText;
	BOOL Leap;	
	int Year,Month,Day;
	strText=GetText();
	Year=atoi(strText);
	Month=atoi(strText.Mid(5,2));
	Day=atoi(strText.Mid(8,2));
	if((Year%4)==0)
	{
		if(((Year%100)==0)&&((Year%400)!=0))
			Leap=FALSE;
		else
			Leap=TRUE;
	}
	else
		Leap=FALSE;
	if(StartPos==4||StartPos==5)
	{
			if(nchar>'1')
			{
				MessageBeep((UINT)-1);
				return FALSE;
			}
			else if(nchar=='1')
			{
				strText=GetText();
				if(strText.GetAt(6)>'2')
				{
					strText.SetAt(6,'2');
					SetText(strText);
					SetSel(StartPos,StartPos);
					return TRUE;
				}
			}
			return TRUE;
	}
	if(StartPos==6)
	{
		strText=GetText();
		if(strText.GetAt(5)=='1')
		{
			if(nchar>'2')
			{
				MessageBeep((UINT)-1);
				return FALSE;
			}
		}
			return TRUE;
	}
	strText=GetText();
	if(StartPos==7||StartPos==8)
	{
		if(Month!=2)
		{
			if(nchar>'3')
				{
					MessageBeep((UINT)-1);
					return FALSE;
				}
				else if(nchar=='3')
				{
					strText=GetText();
					if(strText.GetAt(9)>'0')
					{
						if(Month==4||Month==6||Month==9||Month==11)
						{
							strText.SetAt(9,'0');
						}
						else
							strText.SetAt(9,'1');
						SetText(strText);
						SetSel(StartPos,StartPos);
						return TRUE;
					}			
				}
		}
		else
		{
			if(nchar>'2')
			{
				MessageBeep((UINT)-1);
				return FALSE;
			}
			else if(nchar=='2')
			{			
				strText=GetText();
				if(strText.GetAt(9)>'8')
				{
					if(Leap)
					{
						strText.SetAt(9,'9');
					}
					else
						strText.SetAt(9,'8');
					SetText(strText);
					SetSel(StartPos,StartPos);
					return TRUE;
				}
			}
		}
		return TRUE;				
	}
	if(StartPos==9)
	{
		strText=GetText();
		if(strText.GetAt(8)=='3')
		{
			if(Month==4||Month==6||Month==9||Month==11)
			{
				if(nchar>'0')
				{
					MessageBeep((UINT)-1);
					return FALSE;
				}	
			}
			else if(Month!=2)
			{
				if(nchar>'1')
				{
					MessageBeep((UINT)-1);
					return FALSE;
				}
			}
		}
		else if(strText.GetAt(8)=='2')
		{
			if(Month==2)
			{
				if(Leap)
				{
					if(nchar>'9')
					{
						MessageBeep((UINT)-1);
						return FALSE;
					}
				}
				else
				{
					if(nchar>'8')
					{
						MessageBeep((UINT)-1);
						return FALSE;
					}					
				}
			}
		}
		return TRUE;
	}
	return TRUE;
}
BOOL CMyDateEdit::CheckTime(char nchar,int StartPos,int EndPos)
{
	CString strText;
	if(m_isTime)
	{
		if(StartPos==2||StartPos==3||StartPos==5||StartPos==6)
		{
			if (nchar>'5')
			{
				MessageBeep((UINT)-1);
				return FALSE;
			}
		}	
		if(StartPos==0)
		{
			if (nchar>'2')
			{
				MessageBeep((UINT)-1);
				return FALSE;
			}
			if(nchar=='2')
			{
				if(GetText().GetAt(1)>'3')
				{
					strText=GetText();
					strText.SetAt(1,'3');
					SetWindowText(strText);
					SetSel(StartPos,EndPos);
					return TRUE;
				}
			}
		}	
		if(StartPos==1)
		{
			if(GetText().GetAt(0)=='2')
			{
				if(nchar>'3')
				{
					MessageBeep((UINT)-1);
					return FALSE;			
				}

			}
		}
	}
	if(m_isDateTime)
	{
		if(StartPos==13||StartPos==14||StartPos==16||StartPos==17)
		{
			if (nchar>'5')
			{
				MessageBeep((UINT)-1);
				return FALSE;
			}
		}
		if(StartPos==10||StartPos==11)
		{
			if (nchar>'2')
			{
				MessageBeep((UINT)-1);
				return FALSE;
			}
			if(nchar=='2')
			{
				if(GetText().GetAt(12)>'3')
				{
					strText=GetText();
					strText.SetAt(12,'3');
					SetWindowText(strText);
					SetSel(StartPos,EndPos);
					return TRUE;
				}
			}
		}	
		if(StartPos==12)
		{
			if(GetText().GetAt(11)=='2')
			{
				if(nchar>'3')
				{
					MessageBeep((UINT)-1);
					return FALSE;			
				}

			}
		}
	}	
	return TRUE;
}
LONG CMyDateEdit::OnCut(UINT, LONG)
{
	return 0;
}
// Clears the current selection.
LONG CMyDateEdit::OnClear(UINT wParam, LONG lParam)
{
	return 0;
}
// Pastes the text from the clipboard onto the current selection.
LONG CMyDateEdit::OnPaste(UINT, LONG)
{
	return 0;
}
void CMyDateEdit::SetClassType(int intStyle)
{
 Reset();
 if(intStyle ==edit_date)       //日期
 {
  m_bUseMask = TRUE;
  m_isDate = TRUE; //added this
  m_strMask = _T("0000-00-00");    //掩码
  m_strLiteral = _T("____-__-__"); //掩码有效设置 有效_ 其它-
         m_str = _T("          "); //数据保存空间
   SetWindowText(_T("    -  -  "));
 }
 else if(intStyle ==edit_time)   //时间
 {
  m_bUseMask = TRUE;
  m_isTime = TRUE; 
       m_strMask = _T("00:00:00");
    m_strLiteral = _T("__:__:__");
           m_str = _T("        ");
     SetWindowText(_T("  :  :  "));
 }
 else if(intStyle ==edit_datetime) //日期+时间
 {
   m_bUseMask = TRUE;
   m_isDateTime = TRUE;
      m_strMask = _T("0000-00-00 00:00:00");
   m_strLiteral = _T("____-__-__ __:__:__");
          m_str = _T("                   ");
    SetWindowText(_T("    -  -     :  :  "));
 }
}
CString CMyDateEdit::GetText()
{
	GetWindowText(m_str);
	return m_str;
}
void CMyDateEdit::SetText(CString strText)
{
	int i,j;
	CString str=strText;
	str.TrimLeft();
	str.TrimRight();
	if(str=="") 
	{
		SetDefault();
		return;
	}
	if(m_isDate)
	{
		if(strText.GetLength()<10) return;
		CString strValue=strText.Left(10);
		for (i=0;i<strValue.GetLength();i++)
		{
			if(i==4||i==7)
			{
				strValue.SetAt(i,'-');
			}
			else if(!isdigit(strValue.GetAt(i))&&strValue.GetAt(i)!=' ')
			{
				strValue.SetAt(i,'0');
			}
		}
		SetWindowText(strValue);
		m_str=strValue;
	}
	if(m_isDateTime)
	{
		if(strText.GetLength()<19) return;
		CString strValue=strText.Left(19);
		for (i=0;i<10;i++)
		{
			if(i==4||i==7)
			{
				strValue.SetAt(i,'-');
			}
			else if(!isdigit(strValue.GetAt(i))&&strValue.GetAt(i)!=' ')
			{
				strValue.SetAt(i,'0');
			}
		}	
		strValue.SetAt(10,' ');
		for (j=11;j<19;j++)
		{
			if(j==13||j==16)
			{
				strValue.SetAt(j,':');
			}
			else if(!isdigit(strValue.GetAt(j))&&strValue.GetAt(j)!=' ')
			{
				strValue.SetAt(j,'0');
			}
		}
		m_str=strValue;
		SetWindowText(strValue);
	}
	if(m_isTime)
	{
		if(strText.GetLength()<8) return;
		CString strValue=strText.Left(8);
		for (j=0;j<8;j++)
		{
			if(j==2||j==5)
			{
				strValue.SetAt(j,':');
			}
			else if(!isdigit(strValue.GetAt(j))&&strValue.GetAt(j)!=' ')
			{
				strValue.SetAt(j,'0');

			}
		}
		m_str=strValue;
		SetWindowText(strValue);
	}

}
void CMyDateEdit::Reset()
{
	m_bUseMask=FALSE;
	m_strMask=_T("");
	m_strLiteral=_T("");
	m_bMaskKeyInProgress=FALSE;
	m_strMaskLiteral=_T("");
	m_str = _T("");
	m_isDate = FALSE;//是否是日期格式
	m_isTime = FALSE;//是否是时间格式
	m_isDateTime = FALSE;//是否是日期时间格式
}

void CMyDateEdit::SendChar(UINT nChar)
{
	m_bMaskKeyInProgress=TRUE;
#ifdef WIN32
	AfxCallWndProc(this,m_hWnd,WM_CHAR,nChar,1);
#else
	SendMessage(WM_CHAR,nChar,1);
#endif
	m_bMaskKeyInProgress=FALSE;
}
void CMyDateEdit::SetDefault()
{
 if (m_isDate)
  SetClassType(edit_date);
 else if (m_isTime)
  SetClassType(edit_time);
 else if (m_isDateTime)
 SetClassType(edit_datetime);
}
void CMyDateEdit::SetNow()
{
 COleDateTime tNow = COleDateTime::GetCurrentTime();
 if (m_isDate)
  SetWindowText(tNow.Format("%Y-%m-%d"));
 else if (m_isTime)
  SetWindowText(tNow.Format("%H:%M:%S"));
 else if (m_isDateTime)
  SetWindowText(tNow.Format("%Y-%m-%d %H:%M:%S"));
}
void CMyDateEdit::SetTimeValue(COleDateTime tm)
{
 if (m_isDate)
  SetWindowText(tm.Format("%Y-%m-%d"));
 else if (m_isTime)
  SetWindowText(tm.Format("%H:%M:%S"));
 else if (m_isDateTime)
  SetWindowText(tm.Format("%Y-%m-%d %H:%M:%S"));
}
void CMyDateEdit::SetDetectText(CString strText)
{
	CString strYear,strMonth,strDay,strHour,strMin,strSec;
	COleDateTime tm;
	int i=-1;
	int Year;
	BOOL Leap=FALSE;
	if(m_isDate && strText.GetLength()>=10)
	{
		strYear=strText.Mid(0,4);
		strMonth=strText.Mid(5,2);
		strDay=strText.Mid(8,2);
		strHour="00";
		strMin="00";
		strSec="00";
	}
	if(m_isDateTime && strText.GetLength()>=19)
	{
		strYear=strText.Mid(0,4);
		strMonth=strText.Mid(5,2);
		strDay=strText.Mid(8,2);
		strHour=strText.Mid(11,2);
		strMin=strText.Mid(14,2);
		strSec=strText.Mid(17,2);
	}
	if(m_isTime&& strText.GetLength()>=8)
	{
		strYear="1960";
		strMonth="01";
		strDay="01";
		strHour=strText.Mid(0,2);
		strMin=strText.Mid(3,2);
		strSec=strText.Mid(6,7);
	}
	if(atoi(strYear)<1900 ||atoi(strYear)>2100) strYear="1900";
	if(atoi(strMonth)>12||atoi(strMonth)<1) strMonth="01";
	if(atoi(strDay)>31||atoi(strDay)<1) strDay="01";
	if(atoi(strHour)>23||atoi(strHour)<0) strHour="00";
	if(atoi(strMin)>59||atoi(strMin)<0) strMin="00";
	if(atoi(strSec)>59||atoi(strSec)<0) strSec="00";
	Year=atoi(strYear);
	if((Year%4)==0)
	{
		if(((Year%100)==0)&&((Year%400)!=0))
			Leap=FALSE;
		else
			Leap=TRUE;
	}
	else
		Leap=FALSE;
	if(atoi(strMonth)==1||atoi(strMonth)==3||atoi(strMonth)==5||atoi(strMonth)==7
		||atoi(strMonth)==8||atoi(strMonth)==10||atoi(strMonth)==12)
		strDay=atoi(strDay)>31?"31":strDay;
	if(atoi(strMonth)==4||atoi(strMonth)==6||atoi(strMonth)==9||atoi(strMonth)==11)
		strDay=atoi(strDay)>30?"30":strDay;
	if(atoi(strMonth)==2)
	{
		if(Leap)
			strDay=atoi(strDay)>29?"29":strDay;
		else
			strDay=atoi(strDay)>28?"28":strDay;
	}
	i=tm.SetDateTime(atoi(strYear),atoi(strMonth),atoi(strDay),atoi(strHour),atoi(strMin),atoi(strSec));
	if(i==0)
	{
		SetTimeValue(tm);
		return;
	}
	else
	{
		SetDefault();
	}
}
CString CMyDateEdit::GetDetectText()
{
	GetWindowText(m_str);
	SetDetectText(m_str);
	GetWindowText(m_str);
	return m_str;
}
void CMyDateEdit::OnKillFocus(CWnd* pNewWnd)
{
	GetWindowText(m_str);
	SetDetectText(m_str);
	CEdit::OnKillFocus(pNewWnd);
}